#ifndef LOCK_H_
#define LOCK_H_

#include <Basic.hh>

/**
 * 락 종류.
 */
enum LockType
{
	MutexType
};

//
/**
 * \file Lock.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class Lock Lock.hh
 *
 * 두개 이상의 스레드가 동시에 크리티컬 섹션(CS)에 진입하지 못 하게 한다.
 * 
 * Mutex, Semaphore, R/W Lock을 추상화 하였다.
 */
class Lock
{
public:
	/**
	 * \name generate
	 * 
	 * Lock factory
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	static Lock* generate(LockType Type);
	
	/**
	 * \name lock
	 * 
	 * 크리티컬 섹션을 시작한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf lock() = 0;
	
	/**
	 * \name lockReadOnly
	 * 
	 * 크리티컬 섹션을 시작한다.
	 * 크리티컬 섹션 안에서 보호되는 자원을 읽기만 할 경우에 사용된다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf lockReadOnly() = 0;
	
	/**
	 * \name unlock
	 * 
	 * 크리티컬 섹션을 종료한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf unlock() = 0;
};

#endif //LOCK_H_